package cn.bonoon.kernel.web.annotations.components;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import cn.bonoon.kernel.support.entities.Persistable;

/**
 * <pre>
 * 支持使用多选
 * 
 * 可以使用在{@link AsComboBox}，{@link AsComboGrid}，{@link AsComboTree}组件的定义上
 * 
 * 多选一般是指定在多对多的关联关系上，多对多可以是双向关联也可以是单向关联的，如果是双向关联，
 * 则可以直接使用被编辑的实体的id来加载被选中的项的id数组，然后判断哪些是被选中的；如果是单向关系，
 * 则需要区分关联关系是定义在哪一边的，从关联关系的一边来找出被选中的id
 * </pre>
 * @author jackson
 *
 */
@Target(FIELD)
@Retention(RUNTIME)
public @interface ComboMultipleChecker {
	/**
	 * <pre>
	 * 如果定义的界面实体字段的名称与数据库实体字段的名称相同，则可以不用在这里指定名称
	 * 系统会自动取所定义的界面实体字段的名称。如：AccountEntity.roles
	 * 界面实体定义的是AccountEditor.roles则系统会组成的查询语句为：
	 * select x.id from 
	 * </pre>
	 * @return
	 */
	String multipleProperty() default "";
	
	/**
	 * <pre>
	 * 这里定义的数据库实体，应该是与对应的编辑实体需要编辑的数据库实体一致，
	 * 目前在编辑实体上没有具体的指定数据库实体，所以这个属性需要重新指定。
	 * 
	 * 使用自动生成处理方式：
	 * 如果这个字段有指定，则认为维护关联关系的是在被指定的这一方；如果没有指定
	 * 这个实体，则认为是由AutoDataLoader所定义的数据库实体来维护。
	 * </pre>
	 * @return
	 */
	Class<? extends Persistable> entityClass() default Persistable.class;
}
